
30.03.2016, 22:28
|
Профессор
|
|
Регистрация: 11.03.2013
Сообщений: 789
|
|
Синхронизция двух запросов.
Здравствуйте.Есть форма с несколькими селектами.Для краткости пример на двух. В которые аяксом подгружается список в опшен.Список второго зависит от первого.Те. выбираю в первом ауди, отправляю на сервер,там обрабатывается и возвращает список моделей. Для уменьшения кол-ва запросов назначены переменные которые запоминают выбор.
Вот код
$(function() {
var url = "/modules/mod_search_auto/ajax.php";
var cache ={};
var cache1 ={};
$('select[name="mark"]').change(function() {
var index = $(this)[0].selectedIndex;
var mark = this.options[index].text;
var data = 'marka_id=' + this.value+'&mark='+mark;
alert(data) // marka_id=1002&mark=Aston Martin
if(cache[index]){
$('#bod').html(cache[index]);
}else{
$.ajax({
type:"POST",
url:url,
data: data,
success:function(response){
$('#brn').html(response);
cache[index] = response;
alert(response)// <option id='Vulcan' value='1002' >Vulcan</option><option id='Rapide S' value='1002' >Rapide S</option>
}
})
}
})
$('select[name="brend"]').change(function() {
var index = $(this)[0].options.selectedIndex;
var brend = this.options[index].text;
var data = 'brend_id=' + this.value+'&brend='+brend;
alert(data) // brend_id=1002&brend=Rapide S
if(cache1[index]){
$('#bod').html(cache1[index]);
}else{
$.ajax({
type:"POST",
url:url,
data: data,
success:function(response){
$('#bod').html(response);
cache1[index] = response;
alert(response) // <option id='Седан' value='1002' >Седан</option><option id='купе' value='1002' >купе</option>
}
})
}
})
});
Теперь получается, что если я выбрал Ауди модель А5, а потом передумал и выбрал Опель,то модели так и остались от Ауди, потому как запрос не ушёл.
Можно ли запоминать как то в связке, что ли.Марка-модели.
|
|

31.03.2016, 01:42
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Хорошо, пусть выбрали бренд, затем модель, а если у модели выбирать объем двигателя, и т.д, и т.д, то придется на каждый чих порождать свой метод $.ajax? Посмотрите на свои запросы, они отличаются только набором параметров, а значит метод должен быть один.
Сообщение от ureech
|
Теперь получается, что если я выбрал Ауди модель А5, а потом передумал и выбрал Опель,то модели так и остались от Ауди, потому как запрос не ушёл.
|
Вряд ли браузер медленнее вас думает, чем вы передумываете. А кеш ваш оправдан только в том случае, если ваши данные практически статичны, иначе это зло.
|
|

31.03.2016, 07:59
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
ureech,
Распишите поподробнее логику выбора , а то не совсем понятно
|
|

31.03.2016, 10:16
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
ureech,
Если у вас иерархическая система селектов, то никакой кеш вам не нужен.
Здесь возможны два варианта:
1. Грузятся сразу все селекты, организованные в структуру дерева. В соответствии с выбором в верхних уровнях показываются-скрываются селекты соответствующих ветвей по мере их выбора.
2. По выбору в селекте верхнего уровня грузится селект следующего уровня, удаляются все селекты нижележащих уровней. И т.д. по нижеследующим уровням.
Первый вариант не требует повторных загрузок. Такое возможно при достаточно редких обновлениях данных в БД. Достаточно сложен в реализации.
Второй вариант гораздо проще реализуется и обновляется при обновлении в базе.
|
|

31.03.2016, 12:33
|
Профессор
|
|
Регистрация: 11.03.2013
Сообщений: 789
|
|
Сообщение от Dilettante_Pro
|
2. По выбору в селекте верхнего уровня грузится селект следующего уровня, удаляются все селекты нижележащих уровней. И т.д. по нижеследующим уровням.
|
Сейчас у меня тоже самое, ели убрать кеш.
Сообщение от Dilettante_Pro
|
1. Грузятся сразу все селекты, организованные в структуру дерева. В соответствии с выбором в верхних уровнях показываются-скрываются селекты соответствующих ветвей по мере их выбора.
|
Это интересно.Структура на данный момент древовидная и вывести все в отдельные селекты не проблема, я думаю, это всё php, а вот потом показывать как пока не очень представляю.Положим я скрыл все опшены кроме верхнего селекта, где сами категории(марки авто).Каждой категории соответствует подкатегория(модель) связанная по id-category_id. Я выбираю опшен1 с id = 1 и у меня показывается опшен1 с category_id = 1 селекта2. А вот дальше... Тип кузова, мощность и тд поля таблицы модели и связаны они по названию модели. Значит value модели нужно её название и value кузова тоже, но что тогда для мощности?Хотя можно ограничится и кузовом для начала.  В правильном ли направлениия рассуждаю?
|
|

31.03.2016, 12:37
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
ureech,
Самое то направление. Мощность, по идее, тоже должна лежать в дереве - у определенной модели определенный список мощностей.
А вообще-то вам виднее - смотрите, пробуйте.
|
|

31.03.2016, 12:56
|
Профессор
|
|
Регистрация: 11.03.2013
Сообщений: 789
|
|
ОК,буду пытаться. 
|
|

31.03.2016, 13:31
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
|
|

01.04.2016, 12:01
|
Профессор
|
|
Регистрация: 11.03.2013
Сообщений: 789
|
|
Сообщение от Dilettante_Pro
|
А после этого можно будет вернуться к началу предыдущей темы и сделать универсальную процедуру загрузки
|
Это обязательно, а пока помогите тронуться с места.
Итак я вывел данные в опшен.
<form>
<select name="mark" style="width:100%">
<option value="all">Выбирите марку</option>
{foreach key=tid item=item from=$auto}
<option class="mark" data-id="{$item.id}" value="{$item.title}" >{$item.title}</option>
{/foreach}
</select>
<select name="brends" id="brn" style="width:100%">
<option class="no-hide" selected="selected" value="mrk">Выбирите модель</option>
{foreach key=tid item=item from=$items}
<option class="brend" data-id="{$item.cat_id}" value="{$item.model_car}" >{$item.model_car}</option>
{/foreach}
</select>
</form>
В первом селекте:{$item.id} - id марки авто
{$item.title} - название
Во втором {$item.cat_id} - id категории модели авто, т.е. у {$item.title}:{$item.id}={$item.cat_id}
{$item.model_car} - название модели авто
$(function() {
$('.brend).css('display','none');
$('select[name="mark"]').change(function() {
var index = this.options.selectedIndex;
var data = this.value;
var id_mark = this.options[index].getAttribute('data-id')
})
$('select[name="brends"]').change(function() {
var index = this.options.selectedIndex;
var data = this.value;
var id_brend = this.options[index].getAttribute('data-id')
})
})
Теперь понимаю, что надо как то сравнить id_mark с data-id класса class="brend", что бы отменить .css('display','none'), но не могу допетрить в какую сторону смотреть.
Последний раз редактировалось ureech, 01.04.2016 в 12:06.
|
|

01.04.2016, 12:12
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
ureech,
это у вас html такой?
Сообщение от ureech
|
Итак я вывел данные в опшен.
<form>
<select name="mark" style="width:100%">
<option value="all">Выбирите марку</option>
{foreach key=tid item=item from=$auto}
<option class="mark" data-id="{$item.id}" value="{$item.title}" >{$item.title}</option>
{/foreach}
</select>
<select name="brends" id="brn" style="width:100%">
<option class="no-hide" selected="selected" value="mrk">Выбирите модель</option>
{foreach key=tid item=item from=$items}
<option class="brend" data-id="{$item.cat_id}" value="{$item.model_car}" >{$item.model_car}</option>
{/foreach}
</select>
</form>
|
Вы же не это грузите в html - дайте нормальный html, с которым будет работать JS. Зачем лишние головоломки с переменными PHP?
что бы отменить .css('display','none'), - вы что, поменяли технологию? Прогрузили сразу все? Тогда в селекты надо сразу закладывать древовидную структуру, например, через data-id опшена(прописать такой же в селект следующего уровня) чтобы не гадать - какого марка бренд
Последний раз редактировалось Dilettante_Pro, 01.04.2016 в 12:23.
|
|
|
|